home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / listutil.i < prev    next >
Text File  |  1997-10-26  |  4KB  |  155 lines

  1. IMPLEMENTATION MODULE ListUtils;
  2.  
  3. (*$R-, S-, M-, J+, Z+ *)
  4.  
  5. FROM SYSTEM     IMPORT ADDRESS, LONGWORD;
  6.  
  7. FROM BinOps     IMPORT LowerInt, HigherInt;
  8.  
  9. FROM MagicAES   IMPORT SELECTED, Vertical, GrafDragbox, SHADOWED, ObjcDraw;
  10.  
  11. FROM mtUtils    IMPORT tRect, tObjcTree, SetObjcString, ObjcPos, ObjcFrame, 
  12.                        InclState, ExclState, InclFlag, ExclFlag, CalcArea,
  13.                        SetObjcRect, ObjcStrLen, ObjcRect,
  14.                        ObjcArea;
  15.  
  16. PROCEDURE WordArray (VAR r1, r2 : tRect) : TwoRects;
  17.   VAR two : TwoRects;
  18.       i   : INTEGER;
  19. BEGIN
  20.   two[0] := r1;
  21.   two[1] := r2;
  22.   FOR i := 0 TO 1 DO
  23.     WITH two[i] DO
  24.       w := x+w-1;
  25.       h := y+h-1;
  26.     END;
  27.   END;
  28.   RETURN two
  29. END WordArray;
  30.  
  31. PROCEDURE FrameRects (r1, r2: tRect): tRect;
  32.  
  33.   VAR   r: tRect;
  34.   
  35.   BEGIN
  36.     WITH r DO
  37.       IF r1.x > r2.x THEN x := r2.x ELSE x := r1.x END;
  38.       IF r1.y > r2.y THEN y := r2.y ELSE y := r1.y END;
  39.       r1.w := r1.x + r1.w;
  40.       r2.w := r2.x + r2.w;
  41.       IF r1.w < r2.w THEN w := r2.w - x ELSE w := r1.w - x END;
  42.       r1.h := r1.y + r1.h;
  43.       r2.h := r2.y + r2.h;
  44.       IF r1.h < r2.h THEN h := r2.h - y ELSE h := r1.h - y END;
  45.     END;
  46.     
  47.     RETURN r
  48.   END FrameRects;
  49.   
  50.   PROCEDURE DiffVertRect (r1, r2 : tRect) : tRect;
  51.    (* liefert das Rechteck aus r1, das nicht von r2 berdeckt wird 
  52.     *)
  53.    VAR r : tRect;
  54.   BEGIN
  55.     r := r1;
  56.     r.h := r1.y + r1.h-1;
  57.     (* H”he auf absolute Koordinate *)
  58.     WITH r DO
  59.       IF (r2.y < r1.y) & (r2.y+r2.h >= r1.y)
  60.       THEN
  61.         r.y := r2.y + r2.h-1;
  62.       END;
  63.       IF (r1.y < r2.y) & (r1.y+r1.h > r2.y)
  64.       THEN
  65.         r.h := r2.y;
  66.       END;
  67.     END;
  68.     (* H”he wieder auf relative Koordinate *)
  69.     r.h := r.h - r.y+1;
  70.     (* Jetzt das gleiche fr die X-Richtung *)
  71.     r.w := r1.x + r1.w-1;
  72.     (* Breite auf absolute Koordinate *)
  73.     WITH r DO
  74.       IF (r2.x < r1.x) & (r2.x+r2.w >= r1.x)
  75.       THEN
  76.         r.x := r2.x + r2.w-1;
  77.       END;
  78.       IF (r1.x < r2.x) & (r1.x+r1.w > r2.x)
  79.       THEN
  80.         r.w := r2.x;
  81.       END;
  82.     END;
  83.     (* Breite wieder auf relative Koordinate *)
  84.     r.w := r.w - r.x+1;
  85.     RETURN r
  86.   END DiffVertRect;
  87.   
  88.   PROCEDURE CalcAbsArea (tree : ADDRESS; obj: INTEGER; VAR r : tRect);
  89.   VAR ob, border: INTEGER;
  90.       dial:  tObjcTree;
  91.   BEGIN
  92.    dial:= tree;
  93.    border:= ObjcFrame (tree, obj);
  94.    ObjcArea (tree, obj, r);
  95.    IF border < 0 THEN (* Rahmen ausserhalb des Objekts! *)
  96.     border:= ABS (border);
  97.     DEC (r.x, border);
  98.     DEC (r.y, border);
  99.     INC (r.w, border * 2);
  100.     INC (r.h, border * 2);
  101.    END;
  102.    IF (SHADOWED IN dial^[obj].obState) THEN
  103.     INC (r.w, border * 2);  INC (r.h, border * 2);
  104.    END;
  105.   END CalcAbsArea;
  106.  
  107. (* slider Routinen *)
  108.  
  109. PROCEDURE formSetSlider (dial: ADDRESS;
  110.                          parent, slider : INTEGER;
  111.                          dir : INTEGER;
  112.                          maxVal, currentVal : LONGINT;
  113.                          draw : BOOLEAN);
  114. VAR   (*$Reg *) newPos  : CARDINAL;
  115.       pFrame,
  116.       sFrame,
  117.       dummy  : tRect;
  118.       (*$Reg *) faktor  : INTEGER;
  119.       (*$Reg *) Epp     : LONGINT;
  120. BEGIN
  121.   ObjcRect (dial, parent, pFrame);
  122.   ObjcRect (dial, slider, sFrame);
  123.   CalcAbsArea (dial, slider, dummy);
  124.         
  125.   IF dir = Vertical
  126.   THEN
  127.     IF pFrame.h = sFrame.h THEN (* volle H”he *) RETURN END;
  128.     (* Wert 1000*(Eintr„ge/Pixel) *)
  129.     Epp := ((maxVal*1000) DIV LONG(pFrame.h-sFrame.h));
  130.     WITH sFrame DO
  131.       y := SHORT((currentVal*1000L) DIV Epp);
  132.       IF y+h >= pFrame.h THEN y := pFrame.h-h END;
  133.       IF y<0 THEN y := 0 END;
  134.     END;
  135.   ELSE
  136.     IF pFrame.w = sFrame.w THEN (* volle Breite *) RETURN END;
  137.     Epp := ((maxVal*1000) DIV LONG(pFrame.w-sFrame.w));
  138.     WITH sFrame DO
  139.       x := SHORT((currentVal*1000L) DIV Epp);
  140.       IF x+w >= pFrame.w THEN x := pFrame.w-w END;
  141.       IF x<0 THEN x := 0 END;
  142.     END;
  143.   END;
  144.  
  145.   SetObjcRect (dial, slider, sFrame);
  146.   CalcAbsArea (dial, slider, sFrame);
  147.   IF draw THEN
  148.     dummy := DiffVertRect (dummy, sFrame);
  149.     ObjcDraw (dial, parent, 0, dummy);
  150.     ObjcDraw (dial, slider, 0, sFrame);
  151.   END;
  152. END formSetSlider;
  153.  
  154. END ListUtils.
  155.